package com.zxw.article.service.impl;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zxw.article.mapper.LinkMapper;
import com.zxw.article.service.LinkService;
import com.zxw.common.entity.link.LinkEntity;
import com.zxw.common.entity.link.LinkListQuery;
import com.zxw.common.entity.link.LinkQuery;
import com.zxw.common.entity.link.LinkVO;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author zhanxuewei
 * @since 2022-09-20
 */
@Service
public class LinkServiceImpl extends ServiceImpl<LinkMapper, LinkEntity> implements LinkService {


    /**
     * 添加
     *
     * @param linkQuery LinkQuery
     * @return 是否成功 true|false
     */
    @Override
    public boolean save(LinkQuery linkQuery) {
        LinkEntity linkEntity = new LinkEntity();
        BeanUtils.copyProperties(linkQuery, linkEntity);
        linkEntity.setId(null);
        linkEntity.setStatus("1");
        return super.save(linkEntity);
    }

    /**
     * 批量添加
     *
     * @param list List<LinkQuery>
     * @return 是否成功 true|false
     */
    @Override
    public boolean saveBatch(List<LinkQuery> list) {
        List<LinkEntity> collect = list.stream().map(item -> {
            LinkEntity linkEntity = new LinkEntity();
            BeanUtils.copyProperties(item, linkEntity);
            linkEntity.setId(null);
            linkEntity.setStatus("1");
            return linkEntity;
        }).collect(Collectors.toList());
        return super.saveBatch(collect);
    }

    /**
     * 根据ID集合批量删除
     *
     * @param ids id集合
     * @return 是否成功 true|false
     */
    @Override
    public boolean removeByIds(List<String> ids) {
        return super.removeByIds(ids);
    }

    /**
     * 根据ID修改
     *
     * @param linkQuery LinkQuery
     * @return 是否成功 true|false
     */
    @Override
    public boolean updateById(LinkQuery linkQuery) {
        LinkEntity linkEntity = new LinkEntity();
        BeanUtils.copyProperties(linkQuery, linkEntity);
        return super.updateById(linkEntity);
    }

    /**
     * 根据ID查询数据
     *
     * @param id ID
     * @return LinkDO
     */
    @Override
    public LinkEntity getById(String id) {
        return super.getById(id);
    }

    /**
     * 条件分页查询
     *
     * @param linkListQuery LinkListQuery
     * @return IPage<LinkDO>
     */
    @Override
    public IPage<LinkEntity> list(LinkListQuery linkListQuery) {
        IPage<LinkEntity> pageInfo = new Page<>(linkListQuery.getCurrent(), linkListQuery.getSize());
        QueryWrapper<LinkEntity> queryWrapper = new QueryWrapper<>();
        LambdaQueryWrapper<LinkEntity> lambda = queryWrapper.lambda();
        if (StringUtils.isNotBlank(linkListQuery.getName())) {
            lambda.like(LinkEntity::getName, linkListQuery.getName());
        }
        lambda.orderByDesc(LinkEntity::getSort);
        return super.page(pageInfo, queryWrapper);
    }

    @Override
    public IPage<LinkVO> pageList(LinkListQuery linkListQuery) {
        IPage<LinkEntity> pageInfo = new Page<>(linkListQuery.getCurrent(), linkListQuery.getSize());
        QueryWrapper<LinkEntity> queryWrapper = new QueryWrapper<>();
        LambdaQueryWrapper<LinkEntity> lambda = queryWrapper.lambda();
        if (StringUtils.isNotBlank(linkListQuery.getName())) {
            lambda.like(LinkEntity::getName, linkListQuery.getName());
        }
        if (StringUtils.isNotBlank(linkListQuery.getAddress())) {
            lambda.like(LinkEntity::getAddress, linkListQuery.getAddress());
        }
        if (StringUtils.isNotBlank(linkListQuery.getType())) {
            lambda.eq(LinkEntity::getType, linkListQuery.getType());
        }
        lambda.orderByDesc(LinkEntity::getSort);
        IPage<LinkEntity> page = super.page(pageInfo, queryWrapper);
        return page.convert(linkEntity -> {
            LinkVO linkVO = new LinkVO();
            BeanUtils.copyProperties(linkEntity, linkVO);
            return linkVO;
        });
    }

    @Override
    public List<LinkVO> queryList() {
        QueryWrapper<LinkEntity> queryWrapper = new QueryWrapper<>();
        LambdaQueryWrapper<LinkEntity> lambda = queryWrapper.lambda();
        lambda.orderByDesc(LinkEntity::getSort);
        List<LinkEntity> list = super.list(queryWrapper);
        if (CollUtil.isNotEmpty(list)) {
            return list.stream().map(e -> {
                LinkVO linkVO = new LinkVO();
                BeanUtils.copyProperties(e, linkVO);
                return linkVO;
            }).collect(Collectors.toList());
        }
        return Collections.emptyList();
    }

}
